package org.dousb.doupicture.shared.websocket.disruptor;


import cn.hutool.json.JSONUtil;
import com.lmax.disruptor.WorkHandler;
import lombok.extern.slf4j.Slf4j;
import org.dousb.doupicture.application.service.UserApplicationService;
import org.dousb.doupicture.domain.user.entity.User;
import org.dousb.doupicture.shared.websocket.PictureEditHandler;
import org.dousb.doupicture.shared.websocket.model.PictureEditMessageTypeEnum;
import org.dousb.doupicture.shared.websocket.model.PictureEditRequestMessage;
import org.dousb.doupicture.shared.websocket.model.PictureEditResponseMessage;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import javax.annotation.Resource;

/**
 * PictureEditEventWorkHandler
 * 图片编辑事件处理器（消费者 ）
 *
 * @author 豆沙包
 * @version 1.0
 * @since 2025-11-06  16:51
 */
@Component
@Slf4j
public class PictureEditEventWorkHandler implements WorkHandler<PictureEditEvent> {

    @Resource
    private UserApplicationService userService;

    @Resource
    private PictureEditHandler pictureEditHandler;

    /**
     * 处理图片编辑事件的方法
     *
     * @param pictureEditEvent 图片编辑事件对象，包含会话、用户、图片ID等信息
     * @throws Exception 处理过程中可能抛出的异常
     */
    @Override
    public void onEvent(PictureEditEvent pictureEditEvent) throws Exception {
        // 从事件对象中获取图片编辑请求消息
        PictureEditRequestMessage pictureEditRequestMessage = pictureEditEvent.getPictureEditRequestMessage();
        // 从事件对象中获取WebSocket会话
        WebSocketSession session = pictureEditEvent.getWebSocketSession();
        // 从事件对象中获取用户信息
        User user = pictureEditEvent.getUser();
        // 从事件对象中获取图片ID
        Long pictureId = pictureEditEvent.getPictureId();
        // 从请求消息中获取消息类型
        String type = pictureEditRequestMessage.getType();
        // 根据消息类型值获取对应的枚举对象
        PictureEditMessageTypeEnum pictureEditMessageTypeEnum = PictureEditMessageTypeEnum.getEnumByValue(type);
        //根据消息类型进行不同的处理
        switch (pictureEditMessageTypeEnum) {
            // 处理进入编辑模式的消息
            case ENTER_EDIT:
                pictureEditHandler.handleEnterEditMessage(session, pictureEditRequestMessage, user, pictureId);
                break;
            // 处理退出编辑模式的消息
            case EXIT_EDIT:
                pictureEditHandler.handleExitEditMessage(session, pictureEditRequestMessage, user, pictureId);
                break;
            // 处理编辑操作的消息
            case EDIT_ACTION:
                pictureEditHandler.handleEditActionMessage(session, pictureEditRequestMessage, user, pictureId);
                break;
            default:
                //如果是其他类型 返回错误提示
                // 创建错误响应消息对象
                PictureEditResponseMessage pictureEditResponseMessage = new PictureEditResponseMessage();
                // 设置错误消息类型
                pictureEditResponseMessage.setType(PictureEditMessageTypeEnum.ERROR.getValue());
                // 设置错误提示文本
                pictureEditResponseMessage.setMessage("消息类型错误");
                // 设置用户信息
                pictureEditResponseMessage.setUser(userService.getUserVO(user));
                // 发送错误消息到客户端
                session.sendMessage(new TextMessage(JSONUtil.toJsonStr(pictureEditResponseMessage)));
                break;
        }
    }
}